/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package net.cardgame.oraclecard.animation;

import java.util.HashMap;
import java.util.Random;

import android.graphics.Bitmap;

/**
 * This class represents a single Droidflake, with properties representing its
 * size, rotation, location, and speed.
 */
public class Flake {

	// These are the unique properties of any flake: its size, rotation, speed,
	// location, and its underlying Bitmap object
	float x, y;
	float rotation;
	float speed;
	float rotationSpeed;
	int width, height;
	Bitmap bitmap;
	int move;
	boolean moveLeft;

	// This map stores pre-scaled bitmaps according to the width. No reason to
	// create
	// new bitmaps for sizes we've already seen.
	static HashMap<Integer, Bitmap> bitmapMap = new HashMap<Integer, Bitmap>();

	/**
	 * Creates a new droidflake in the given xRange and with the given bitmap.
	 * Parameters of location, size, rotation, and speed are randomly
	 * determined.
	 */
	static Flake createFlake(float xRange, Bitmap originalBitmap, int width,
			int x) {
		Flake flake = new Flake();
		// Size each flake with a width between 5 and 55 and a proportional
		// height
		flake.width = width;
		flake.height = width;

		// Position the flake horizontally between the left and right of the
		// range
		Random random = new Random();
		flake.x = random.nextInt((int) xRange - flake.width);
		if (flake.x > xRange / 2)
			flake.moveLeft = true;
		else
			flake.moveLeft = false;
		// Position the flake vertically slightly off the top of the display
		flake.y = 0 - (flake.height);

		// Each flake travels at 50-200 pixels per second
		flake.speed = 50;

		// Flakes start at -90 to 90 degrees rotation, and rotate between -45
		// and 45
		// degrees per second
		flake.rotation = (float) Math.random() * 180 - 90;
		flake.rotationSpeed = (float) Math.random() * 90 - 45;

		// Get the cached bitmap for this size if it exists, otherwise create
		// and cache one
		flake.bitmap = bitmapMap.get(x);
		if (flake.bitmap == null) {
			flake.bitmap = Bitmap.createScaledBitmap(originalBitmap,
					(int) flake.width, (int) flake.height, true);
			bitmapMap.put(x, flake.bitmap);
		}
		return flake;
	}
}
